/**
 * @file    event_mng.h
 * @brief   系统历史事件
 * @author  Liu wei 
 * @version 1.0.1
 * @date    2023-04-18
 * 
 * @copyright Copyright (c) 2023 JBD-Energy Storage Technology Co. LTD
 * 
 * @par 修改日志:
 * <table>
 * <tr><th>Date       <th>Version   <th>Author   <th>Description
 * <tr><td>2023-04-18 <td>1.0.1     <td>Liuwei   <td>首次创建
 * </table>
 */

#ifndef __EVENT_MNG_H_
#define __EVENT_MNG_H_                                

/** Includes -----------------------------------------------------------------*/
#include <stdint.h>
//#include "If_nvm.h"
/** Cplusplus ----------------------------------------------------------------*/
#ifdef __cplusplus
extern "C"
{
#endif

/** Private macro/define -----------------------------------------------------*/
#define EVENT_RAM_BUF_SIZE                              (10)       /*!< RAM 事件缓冲区大小 */ 
#define EVENT_MAX_SIZE                                  (500)      /*!< 事件最大存储长度 */
#define EVENT_IDX_LEN                                   (18)
#define EVENT_IDX_ADDR                                  (NVM_EVENT_ST_ADDR)        /*!< 存放历史事件的位置地址 */
#define EVENT_RCD_ADDR                                  (EVENT_IDX_ADDR + EVENT_IDX_LEN) /*!< 第1条告警信息起始地址 */
#define EVENT_DATA_SIZE                                 (100)      /* 1条数据长度*/

#define EVENT_CELL_MAX                                  (16)       /* 单体最大存储 */
#define EVENT_TEMP_MAX                                  (8)        /* 温度最大存储*/

/** @brief 告警信息数据 */
typedef union 
{
    uint32_t alm_word;
    struct
    {
        uint32_t cov : 1 ;           /*!< (00)单体过高 */
        uint32_t cuv : 1 ;           /*!< (01)单体过低 */
        uint32_t bov : 1 ;           /*!< (02)总压过高 */
        uint32_t buv : 1 ;           /*!< (03)总压过低 */
        uint32_t occ : 1 ;           /*!< (04)充电过流 */
        uint32_t ocd : 1 ;           /*!< (05)放电过流 */
        uint32_t ocd2 : 1 ;          /*!< (06)放电过流 */
        uint32_t otc : 1 ;           /*!< (07)充电过温 */
        uint32_t utc : 1 ;           /*!< (08)充电欠温 */
        uint32_t otd : 1 ;           /*!< (09)放电过温 */
        uint32_t utd : 1 ;           /*!< (10)放电欠温 */  
        uint32_t otm : 1 ;           /*!< (11)MOS高温 */
        uint32_t ote : 1 ;           /*!< (12)环境高温 */
		uint32_t ute : 1 ;           /*!< (13)环境低温 */
        uint32_t vdiff: 1 ;          /*!< (14)压差过大 */
        uint32_t tdiff: 1 ;          /*!< (15)温差过大 */
        uint32_t soc: 1 ;            /*!< (16)SOC过低 */
        uint32_t eep: 1 ;            /*!< (17)eep故障 */
        uint32_t rtc: 1 ;            /*!< (18)rtc故障 */
    }bit;
}alm_type;

/** @brief 保护信息数据 */
typedef union 
{
    uint32_t prp_word;
    struct
    {
        uint32_t cov : 1 ;           /*!< (00)单体过高 */
        uint32_t cuv : 1 ;           /*!< (01)单体欠压 */
        uint32_t bov : 1 ;           /*!< (02)总压过高 */
        uint32_t buv : 1 ;           /*!< (03)总压过低 */
        uint32_t occ : 1 ;           /*!< (04)充电过流 */
        uint32_t ocd : 1 ;           /*!< (05)放电过流 */
        uint32_t ocd2 : 1 ;          /*!< (06)放电过流 */
        uint32_t otc : 1 ;           /*!< (07)充电过温 */
        uint32_t utc : 1 ;           /*!< (08)充电欠温 */
        uint32_t otd : 1 ;           /*!< (09)放电过温 */
        uint32_t utd : 1 ;           /*!< (10)放电欠温 */
        uint32_t ote : 1 ;           /*!< (11)环境高温 */
		uint32_t ute : 1 ;           /*!< (12)环境低温 */
        uint32_t otm : 1 ;           /*!< (13)MOS高温 */
		uint32_t sc : 1;             /*!< (14)短路保护 */
        uint32_t vdiff: 1 ;          /*!< (15)压差过大 */
        uint32_t tdiff: 1 ;          /*!< (16)温差过大 */
		uint32_t socl: 1 ;           /*!< (17)SOC过低 */
		uint32_t col : 1 ;           /*!< (18)单体掉线 */
	    uint32_t tol : 1 ;           /*!< (19)温度掉线 */
		uint32_t fcmos : 1 ;         /*!< (20)CMOS故障 */
	    uint32_t fdmos : 1 ;         /*!< (21)满充保护 */
	    uint32_t limit : 1;          /*!< (22)限流异常*/
        uint32_t ariosol : 1;        /*!< (23)气溶胶故障*/
		uint32_t afe_err : 1;        /*!< (24)AFE通信故障 */
    }bit;
}prp_type;

#pragma pack(1)
/** 
 * @brief MOS 状态
*/
typedef union
{
    uint8_t byte;
    struct 
    {
        uint8_t DMOS : 1;  // 放电MOS
        uint8_t CMOS : 1;  // 充电MOS
        uint8_t PMOS : 1;  // 预充MOS
        uint8_t HOT_MOS : 1; // 加热MOS
        uint8_t FAN_MOS : 1; // 散热MOS
        uint8_t LIMIT : 1;  // 限流模块
		uint8_t RLY_SOC : 1; // SOC干接点
		uint8_t RLY_FAULT : 1; // 故障干接点
    }name;
}mos_state_type;

typedef union 
{
    uint8_t byte_buf[EVENT_DATA_SIZE];
    struct
    { 
        uint8_t addr;               /*!< BMS地址*/
        uint8_t year;               /*!< 年 */
        uint8_t month;              /*!< 月 */
        uint8_t day;                /*!< 日 */
        uint8_t hour;               /*!< 时 */
        uint8_t min;                /*!< 分 */
        uint8_t sec;                /*!< 秒 */
        uint8_t event_id;           /*!< 发生事件 ID */
        uint16_t now_val;           /*!< 当前发生的值 */
        uint16_t para_val;          /*!< 参数值 */
        uint16_t batt_volt;         /*!< 总电压 */
        uint16_t bus_curr;          /*!< 母线电流 */
        uint8_t soc;                /*!< SOC */
        uint8_t soh;                /*!< SOH */
        mos_state_type mos_state;   /*!< MOS管状态 */
		uint8_t sys_state;          /*!< 系统状态 */
        alm_type alm_msg;           /*!< 告警信息 */
        prp_type prp_msg;           /*!< 保护信息 */
        uint16_t full_cap;          /*!< 满充容量*/
        uint16_t std_cap;           /*!< 标称容量 */
        uint16_t real_cap;          /*!< 剩余容量 */
        int16_t env_temp;           /*!< 环境温度 */
        int16_t mos_temp;           /*!< MOS管温度 */
		uint32_t acc_dsg_ah;        /*!< 累计放电AH */
        uint32_t acc_chg_ah;        /*!< 累计充电AH */
        uint8_t cell_num;           /*!< 单体个数	*/
        uint16_t cell_buf[EVENT_CELL_MAX];   /*!< 单体电压值 */
        uint8_t temp_num;          /*!< 温度个数 */
        uint8_t temp_buf[EVENT_TEMP_MAX];    /*!< 温度值 */
		uint16_t cycle;
    }name;
}event_data_type;

#pragma pack()

/** Typedef ------------------------------------------------------------------*/
/** @brief 事件ID名称*/
typedef enum event_id
{
    EVT_ID_POWER_UP = 0x01 ,  /*!< (0x01)系统上电 */
    EVT_ID_IN_CHG          ,  /*!< (0x02)充电状态 */
    EVT_ID_IN_DSG          ,  /*!< (0x03)放电状态 */
    EVT_ID_FT_EEP          ,  /*!< (0x04)EEP存储故障 */
    EVT_ID_FT_RTC          ,  /*!< (0x05)RTC时钟故障 */
    EVT_ID_TIME_STORE      ,  /*!< (0x06)定时存储 */
    EVT_ID_LPW_SLEEP       ,  /*!< (0x07)欠压休眠 */
    EVT_ID_CMD_SLEEP       ,  /*!< (0x08)命令休眠 */
    EVT_ID_FULL_CHG        ,  /*!< (0x09)满充校准 */
    EVT_ID_INTO_LIMIT      ,  /*!< (0x0A)进入限流 */
    EVT_ID_FT_LIMIT        ,  /*!< (0x0B)限流异常 */
    EVT_ID_FT_AIROSOL      ,  /*!< (0x0C)气熔胶故障 */
    EVT_ID_WDG_TIMEOUT     ,  /*!< (0x0D)看门狗溢出故障 */

    EVT_ID_ALM_COV = 0x21  ,  /*!< (0x21)单体过压告警 */
    EVT_ID_ALM_CUV         ,  /*!< (0x22)单体欠压告警 */
    EVT_ID_ALM_BOV         ,  /*!< (0x23)总压过压告警 */
    EVT_ID_ALM_BUV         ,  /*!< (0x24)总压欠压告警 */
    EVT_ID_ALM_OCC         ,  /*!< (0x25)充电过流告警 */
    EVT_ID_ALM_OCD         ,  /*!< (0x26)放电过流告警 */
    EVT_ID_ALM_OTC         ,  /*!< (0x27)充电过温告警 */
    EVT_ID_ALM_UTC         ,  /*!< (0x28)充电欠温告警 */
    EVT_ID_ALM_OTD         ,  /*!< (0x29)放电过温告警 */
    EVT_ID_ALM_UTD         ,  /*!< (0x2A)放电欠温告警 */
    EVT_ID_ALM_OTE         ,  /*!< (0x2B)环境高温 */
    EVT_ID_ALM_OTM         ,  /*!< (0x2C)MOS高温 */
    EVT_ID_ALM_VDIFF       ,  /*!< (0x2D)压差过大 */
    EVT_ID_ALM_TDIFF       ,  /*!< (0x2E)温差过大 */
	EVT_ID_ALM_UTE         ,  /*!< (0x2F)环境欠温告警 */

    EVT_ID_PRP_COV = 0x41  ,  /*!< (0x41)单体过压保护 */
    EVT_ID_PRP_CUV         ,  /*!< (0x42)单体欠压保护 */
    EVT_ID_PRP_BOV         ,  /*!< (0x43)总压过压保护 */
    EVT_ID_PRP_BUV         ,  /*!< (0x44)总压欠压保护 */
    EVT_ID_PRP_OCC         ,  /*!< (0x45)充电过流保护 */
	EVT_ID_PRP_OCC2        ,  /*!< (0x46)充电过流保护2 */
    EVT_ID_PRP_OCD         ,  /*!< (0x47)放电过流保护 */
    EVT_ID_PRP_OCD2        ,  /*!< (0x48)放电过流保护 */
    EVT_ID_PRP_OTC         ,  /*!< (0x49)充电过温保护 */
    EVT_ID_PRP_UTC         ,  /*!< (0x4A)充电欠温保护 */
    EVT_ID_PRP_OTD         ,  /*!< (0x4B)放电过温保护 */
    EVT_ID_PRP_UTD         ,  /*!< (0x4C)放电欠温保护 */
    EVT_ID_PRP_OTE         ,  /*!< (0x4D)环境高温保护 */
	EVT_ID_PRP_UTE         ,  /*!< (0x4E)环境欠温保护 */
    EVT_ID_PRP_OTM         ,  /*!< (0x4F)MOS高温保护 */
    EVT_ID_PRP_VDIFF       ,  /*!< (0x50)压差过大保护 */
    EVT_ID_PRP_TDIFF       ,  /*!< (0x51)温差过大保护 */
    EVT_ID_FT_COL          ,  /*!< (0x52)单体掉线 */
    EVT_ID_FT_TOL          ,  /*!< (0x53)温度掉线 */
    EVT_ID_FT_CMOS         ,  /*!< (0x54)充电MOS故障 */
    EVT_ID_FT_DMOS         ,  /*!< (0x55)放电MOS故障 */
    EVT_ID_FT_SC           ,  /*!< (0x56)短路保护 */
    EVT_ID_FT_AFE          ,  /*!< (0x57)AFE通信故障*/
    EVT_ID_REVERSE         ,  /*!< (0x58)反接保护*/
    EVT_ID_SC_LOCK         ,  /*!< (0x59)短路锁定 */
    EVT_ID_OCC_LOCK        ,  /*!< (0x5A)充电过流锁定 */
    EVT_ID_OCD_LOCK        ,  /*!< (0x5B)放电过流锁定 */
    EVT_ID_OCC_TRY         ,  /*!< (0x5C)充电过流尝试 */
	EVT_ID_OCD_TRY         ,  /*!< (0x5D)放电过流尝试 */
	EVT_ID_SC_TRY          ,  /*!< (0x5E)短路过流尝试 */

    EVT_ID_MAX             ,  
}event_id_type;

/** Global variable ----------------------------------------------------------*/

/** ----------------------------------------------------------------------------
  *                             Global Function                                *
  ----------------------------------------------------------------------------*/
/*******************************************************************************
 * public API List
 ******************************************************************************/
void event_init(void);
void event_clr_all(void);
uint8_t event_write_to_nvm(void);
uint16_t event_get_index(void);
uint16_t event_get_use_num(void);
uint8_t event_add_to_sram(uint8_t evt_id, uint16_t data ,uint16_t param);
uint8_t event_read_event(uint16_t idx, event_data_type *pevt);

/*! @} End of Interface API List */

#ifdef __cplusplus
}
#endif

#endif  /* #ifndef __EVENT_MNG_H_ */
/********** Copyright (c) 2023 JBD-Energy Storage Technology Co. LTD *********/
